package com.t.bricks.bussiness.db.mapper.common;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.t.bricks.bussiness.module.common.CheckRepeatFieldInfo;
import com.t.bricks.model.OrderInfo;
import com.t.bricks.model.Page;

/**
 * 通用数据库操作脚本接口
 * @author huangxinbian
 */
@Mapper
public interface CommonMapper {
	
	/**
	 * 根据语句查询数据
	 * @param sql
	 * @return
	 */
	List<Map<String, Object>> findBySql(@Param("sql") String sql);
	
	/**
	 * 添加
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param fieldMap 字段集合
	 * @return int
	 */
	int add(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("fieldMap") Map<String, Object> fieldMap
	);
	
	/**
	 * 批量添加
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param fieldName 字段名集合
	 * @param fieldValues 字段值集合
	 * @return int
	 */
	int adds(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("fieldName") List<String> fieldName,
		@Param("fieldValues") List<List<Object>> fieldValues
	);

	/**
	 * 删除
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param iVersion 版本号
	 * @param onlyCreator 仅创建者可见
	 * @return int
	 */
	int del(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("iVersion") Integer iVersion,
		@Param("onlyCreator") boolean onlyCreator
	);

	/**
	 * 批量删除
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValues 编号值集合
	 * @param onlyCreator 仅创建者可见
	 * @return int
	 */
	int dels(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValues") List<Object> idValues,
		@Param("onlyCreator") boolean onlyCreator
	);

	/**
	 * 删除树形节点数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idValue 节点编号值
	 * @return int
	 */
	int delNode(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idValue") Object idValue
	);

	/**
	 * 修改
	 * 注意:当对象的属性值为null时不更新字段
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param fieldMap
	 * @param iVersion 版本号
	 * @param onlyCreator 仅创建者可见
	 * @return int
	 */
	int edit(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("fieldMap") Map<String, Object> fieldMap,
		@Param("iVersion") Integer iVersion,
		@Param("onlyCreator") boolean onlyCreator
	);
	
	/**
	 * 查询整个表数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param onlyCreator 过滤非创建者数据
	 * @return List<Map<String, Object>>
	 */
	List<Map<String, Object>> findAll(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("onlyCreator") boolean onlyCreator
	);
	
	/**
	 * 根据编号查询数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param onlyCreator 过滤非创建者数据
	 * @return Object
	 */
	Map<String, Object> findById(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("onlyCreator") boolean onlyCreator
	);
	
	/**
	 * 根据编号集合查询数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValues 编号值集合
	 * @param onlyCreator 过滤非创建者数据
	 * @return Object
	 */
	List<Map<String, Object>> findByIds(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValues") List<Object> idValues,
		@Param("onlyCreator") boolean onlyCreator
	);

	/**
	 * 根据字段名取指定记录编号的数据库表中对应字段的值
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param fieldNames 待取数据的字段名称集合
	 * @param onlyCreator 过滤非创建者数据
	 * @return Map<String, Object> 返回内容data中存放的是Map
	 */
	Map<String, Object> getValueByFieldName(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("fieldNames") List<String> fieldNames,
		@Param("onlyCreator") boolean onlyCreator
	);

	/**
	 * 取记录对应的版本号
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @return
	 */
	Integer getiVersion(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue
	);

	/**
	 * 根据关键值取对象集合
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param fieldMap 字段条件集合
	 * @param onlyCreator 过滤非创建者数据
	 * @return
	 */
	List<Map<String, Object>> findByKey(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("fieldMap") Map<String, Object> fieldMap,
		@Param("onlyCreator") boolean onlyCreator
	);

	/**
	 * 根据关键值查询数量
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param fieldMap 字段条件集合
	 * @param onlyCreator 过滤非创建者数据
	 * @return int
	 */
	int findCountByKey(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("fieldMap") Map<String, Object> fieldMap,
		@Param("onlyCreator") boolean onlyCreator
	);
    
	/**
	 * 查询分页信息
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param onlyCreator 仅创建者可见
	 * @param conditionMap 普通类条件
	 * @param conditionRangeStMap 范围类开始条件
	 * @param conditionRangeEdMap 范围类结束条件
	 * @param conditionLikeMap 模糊类结束条件
	 * @param sLikeStr 全文检索
	 * @param dLikeDateSt 检索的开始时间范围
	 * @param dLikeDateEd 检索的结束时间范围
	 * @param page 分页信息对象
	 * @param orders 排序数据集合
	 * @param appendFieldSql 附属字段脚本片段
	 * @param dictionarySql 关联字典脚本片段
	 * @param defaultOrderSql 默认排序脚本片段
	 * @return List<Map<String, Object>>
	 */
	List<Map<String, Object>> findByPage(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("onlyCreator") boolean onlyCreator,
		@Param("conditionMap") Map<String, Object> conditionMap,
		@Param("conditionRangeStMap") Map<String, Object> conditionRangeStMap,
		@Param("conditionRangeEdMap") Map<String, Object> conditionRangeEdMap,
		@Param("conditionLikeMap") List<String> conditionLikeMap,
		@Param("sLikeStr") String sLikeStr,
		@Param("dLikeDateSt") Date dLikeDateSt,
		@Param("dLikeDateEd") Date dLikeDateEd,
		@Param("page") Page page,
		@Param("orders") List<OrderInfo> orders,
		@Param("appendFieldSql") String appendFieldSql,
		@Param("dictionarySql") String dictionarySql,
		@Param("defaultOrderSql") String defaultOrderSql
	);
    
	/**
	 * 查询分页总数
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param onlyCreator 仅创建者可见
	 * @param conditionMap 普通类条件
	 * @param conditionRangeStMap 范围类开始条件
	 * @param conditionRangeEdMap 范围类结束条件
	 * @param conditionLikeMap 模糊类结束条件
	 * @param sLikeStr 全文检索
	 * @param dLikeDateSt 检索的开始时间范围
	 * @param dLikeDateEd 检索的结束时间范围
	 * @return int 
	 */
	int findByPageCount(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("onlyCreator") boolean onlyCreator,
		@Param("conditionMap") Map<String, Object> conditionMap,
		@Param("conditionRangeStMap") Map<String, Object> conditionRangeStMap,
		@Param("conditionRangeEdMap") Map<String, Object> conditionRangeEdMap,
		@Param("conditionLikeMap") List<String> conditionLikeMap,
		@Param("sLikeStr") String sLikeStr,
		@Param("dLikeDateSt") Date dLikeDateSt,
		@Param("dLikeDateEd") Date dLikeDateEd
	);

	/**
	 * 根据记录编号查询符合分页数据的某条记录
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param onlyCreator 仅创建者可见
	 * @param appendFieldSql 附属字段脚本片段
	 * @param dictionarySql 关联字典脚本片段
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @return
	 */
	Map<String, Object> findByPageRow(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("onlyCreator") boolean onlyCreator,
		@Param("appendFieldSql") String appendFieldSql,
		@Param("dictionarySql") String dictionarySql,
		@Param("idName") String idName,
		@Param("idValue") Object idValue
	);
	
	/**
	 * 查询指定时间内数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param onlyCreator 仅创建者可见
	 * @param appendFieldSql 附属字段脚本片段
	 * @param dictionarySql 关联字典脚本片段
	 * @param timeFileName 时间字段
	 * @param dDateSt 开始时间
	 * @param dDateEd 结束时间
	 * @return List
	 */
	List<Map<String, Object>> findByDate(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("onlyCreator") boolean onlyCreator,
		@Param("appendFieldSql") String appendFieldSql,
		@Param("dictionarySql") String dictionarySql,
		@Param("timeFileName") String timeFileName,
		@Param("dDateSt") Date dDateSt,
		@Param("dDateEd") Date dDateEd
	);

	/**
	 * 查询搜索用的数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param appendFieldSql 字段脚本片段
	 * @param dictionarySql 字典表相关脚本片段
	 * @param whereStr 查询条件字符串
	 * @param orders 排序数据集合
	 * @return List<Map<String, Object>>
	 */
	List<Map<String, Object>> findBySearch(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("appendFieldSql") String appendFieldSql,
		@Param("dictionarySql") String dictionarySql,
		@Param("whereStr") String whereStr,
		@Param("orders") List<OrderInfo> orders
	);

	/**
	 * 查询导出到文件的数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param onlyCreator 仅创建者可见
	 * @param conditionMap 普通类条件
	 * @param conditionRangeStMap 范围类开始条件
	 * @param conditionRangeEdMap 范围类结束条件
	 * @param conditionLikeMap 模糊类结束条件
	 * @param sLikeStr 全文检索
	 * @param dLikeDateSt 检索的开始时间范围
	 * @param dLikeDateEd 检索的结束时间范围
	 * @param orders 排序数据集合
	 * @param appendFieldSql 附属字段脚本片段
	 * @param dictionarySql 关联字典脚本片段
	 * @param defaultOrderSql 默认排序脚本片段
	 * @return List<Map<String, Object>>
	 */
	List<Map<String, Object>> findByExport(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("onlyCreator") boolean onlyCreator,
		@Param("conditionMap") Map<String, Object> conditionMap,
		@Param("conditionRangeStMap") Map<String, Object> conditionRangeStMap,
		@Param("conditionRangeEdMap") Map<String, Object> conditionRangeEdMap,
		@Param("conditionLikeMap") List<String> conditionLikeMap,
		@Param("sLikeStr") String sLikeStr,
		@Param("dLikeDateSt") Date dLikeDateSt,
		@Param("dLikeDateEd") Date dLikeDateEd,
		@Param("orders") List<OrderInfo> orders,
		@Param("appendFieldSql") String appendFieldSql,
		@Param("dictionarySql") String dictionarySql,
		@Param("defaultOrderSql") String defaultOrderSql
	);
	
	/**
	 * 修改状态
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param iState 状态值
	 * @param iVersion 记录版本号
	 * @param sMemo 备注
	 * @return int 返回执行情况
	 */
	int changeState(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("iState") Integer iState,
		@Param("iVersion") Integer iVersion,
		@Param("sMemo") String sMemo
	);
	
	/**
	 * 修改步骤值(如果设置为单向则新值必须大于旧值)
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param iSetp 步骤值
	 * @param iVersion 记录版本号
	 * @param sMemo 备注
	 * @param unidirectional 是否单向 设置为单向则新值必须大于旧值才能执行
	 * @return int 返回执行情况
	 */
	int changeSetp(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("iSetp") Integer iSetp,
		@Param("iVersion") Integer iVersion,
		@Param("sMemo") String sMemo,
		@Param("unidirectional") boolean unidirectional
	);

	/**
	 * 读取树形结构数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param sGroupName
	 * @param sUserId
	 * @return
	 */
	List<Map<String, Object>> findByTree(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("sGroupName") String sGroupName,
		@Param("sUserId") String sUserId
	);
	
	/**
	 * 取指定节点下的子节点编号
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param sPid 父节点
	 * @return
	 */
	String newChildId(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("sPid") String sPid
	);
	
	/**
	 * 验证树形数据待修改的数据是否重复
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param sId
	 * @param sName
	 * @return
	 */
	int checkRepeatByEditAndTree(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("sId") String sId,
		@Param("sName") String sName
	);
	
	/**
	 * 验证树形数据待新增的数据是否重复
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param sPid
	 * @param sName
	 * @return
	 */
	int checkRepeatByAddAndTree(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("sPid") String sPid,
		@Param("sName") String sName
	);

	/**
	 * 检查待修改内容是否存在重复数据(单独字段重复即重复)
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param checkRepeatList
	 * @return
	 */
	int checkRepeatByEditAndAlone(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("checkRepeatList") List<CheckRepeatFieldInfo> checkRepeatList
	);

	/**
	 * 检查待新增内容是否存在重复数据(单独字段重复即重复)
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param checkRepeatList
	 * @return
	 */
	int checkRepeatByAddAndAlone(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("checkRepeatList") List<CheckRepeatFieldInfo> checkRepeatList
	);

	/**
	 * 检查待修改内容是否存在重复数据(多字段组合重复即重复)
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @param checkRepeatMap
	 * @return
	 */
	int checkRepeatByEditAndCombination(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue,
		@Param("checkRepeatMap") Map<String, Object> checkRepeatMap
	);

	/**
	 * 检查待新增内容是否存在重复数据(多字段组合重复即重复)
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param checkRepeatMap
	 * @return
	 */
	int checkRepeatByAddAndCombination(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("checkRepeatMap") Map<String, Object> checkRepeatMap
	);
	
	/**
	 * 根据字段名取分组数据
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param sCreator 指定用户
	 * @param fields 字段名与别名对象
	 * @return
	 */
	List<Map<String, Object>> groupByField(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("sCreator") String sCreator,
		@Param("fields") Map<String, String> fields
	);
	
	/**
	 * 取表中指定字段的最大值
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param sCreator 指定用户
	 * @param field 字段名
	 * @param conditionMap 普通类条件
	 * @param conditionRangeStMap 范围类开始条件
	 * @param conditionRangeEdMap 范围类结束条件
	 * @param conditionLikeMap 模糊类结束条件
	 * @return
	 */
	Map<String, Object> maxByField(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("sCreator") String sCreator,
		@Param("field") String field,
		@Param("conditionMap") Map<String, Object> conditionMap,
		@Param("conditionRangeStMap") Map<String, Object> conditionRangeStMap,
		@Param("conditionRangeEdMap") Map<String, Object> conditionRangeEdMap
	);
	
	/**
	 * 取表中指定字段的最小值
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param sCreator 指定用户
	 * @param field 字段名
	 * @param conditionMap 普通类条件
	 * @param conditionRangeStMap 范围类开始条件
	 * @param conditionRangeEdMap 范围类结束条件
	 * @param conditionLikeMap 模糊类结束条件
	 * @return
	 */
	Map<String, Object> minByField(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("sCreator") String sCreator,
		@Param("field") String field,
		@Param("conditionMap") Map<String, Object> conditionMap,
		@Param("conditionRangeStMap") Map<String, Object> conditionRangeStMap,
		@Param("conditionRangeEdMap") Map<String, Object> conditionRangeEdMap
	);
	
	/**
	 * 检查记录编号值记录是否存在
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param idName 编号字段名称
	 * @param idValue 编号值
	 * @return MsgEmity
	 */
	int hasById(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("idName") String idName,
		@Param("idValue") Object idValue
	);
	
	/**
	 * 检查关键值记录是否存在
	 * @param sDbName 库名
	 * @param sTableName 表名
	 * @param keyName 编号字段名称
	 * @param idValue 编号值
	 * @return MsgEmity
	 */
	int hasByKey(
		@Param("sDbName") String sDbName,
		@Param("sTableName") String sTableName,
		@Param("keyName") String keyName,
		@Param("keyValue") Object keyValue
	);
	
}

